跳到主要内容

子查询,sub-query

出现在其他语句内部的查询语句,称之为子查询

场景:

最高的学生

按照 身高,降序,取得第一个!

问题是出现等高的学生,问题不能处理!

应该,找到最高的身高,然后找到所有符合最高身高的学生!

**此时,**select max()出现在 另外的语句内部,称之为 子查询语句!

注意:子查询,应该始终出现在括号内!

子查询的分类
------

分类的依据!

两种分类依据:

1, 依据 子查询出现的位置!

where型子查询, 出现在where子句内!

from 型子查询, 出现在from子句内!

2, 依据 子查询的返回数据的格式!

标量子查询,返回值是一个数据,称之为标量子查询!

列子查询,返回一个列,

行子查询,返回一个行,

表子查询,返回的是一个二维表

from型
-----

场景:

查询,每个班级之内,最高的学生

应该先将每个班最高的放置在 班内的第一个位置,再按照班级进行分组!

不能使用 order by 再 group by。

而需要,先用一个查询,得到身高排序结果,再将该结果分组!

留意:from 需要一个数据还是一个表,需要将子查询返回的数据,导出成表即可!

为子查询起个别名即可!

列子查询
----

返回值应该是一列!

由于返回的是一列,是一类数据,看成是一个集合!

找到班级内有女同学的男学生信息:

条件,先确定哪些班级有女生!

再在该班级之内,找到所有的男生!

典型的列子查询使用 in, not in作为子查询的条件!

列子查询,还可以使用

= some

!= all

或者其他的运算符配合 some() 和 all()语法完成!

some(), 表示集合中的一部分!

all(), 集中的全部

测试:

=some() 相当于in 么?

!=some()相当于什么? 不相当于not in!

哪个相当于not in ,与集合内的任何一个值都不相等!

!= all() 是not in!

any就是some,一个功能!

行子查询
----

场景:找到,高富,最高并且最有钱!

使用行子查询可以,一次性查出来一个行(多个行)使用 行进行匹配:

上面使用了 (),构建了一行!与子查询的行作比较!

exists型子查询
----------

判断依据不是根据子查询所返回的数据! 只是根据 子查询是否存在返回数据来看;

exists (子查询)

如果子查询存在返回数据,则exists返回真。反之,返回假!

出现在where条件内:

场景:

班级已经不存在的学生!

not exists!

![](0484205E42F21FECE029DD1EAC9FBBCB.png)

上一篇: [21 连接查询,join](http://arick.leanote.com/post/21-%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%EF%BC%8Cjoin)